﻿package kit4j.util.lang;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 字符串工具类。提供针对字符串对象的各种常用测试验证方法。
 * 
 * @author MiniKnife
 * 
 */
public abstract class StringUtil {

	/**
	 * 单例对象持有者。
	 * 
	 * @author MiniKnife
	 * 
	 */
	private static class SingletonHolder {

		private static Pattern blankPattern = Pattern.compile("\\s*?");

		private static Pattern sqlOperatorPattern = Pattern.compile(".*['=].*");

		/**
		 * @return 匹配空白字符串的正则表达式的Pattern对象。
		 */
		static Pattern getBlankPattern() {
			return blankPattern;
		}

		/**
		 * @return 匹配SQL操作符的正则表达式Pattern对象。
		 */
		static Pattern getSqlOperatorPattern() {
			return sqlOperatorPattern;
		}
	}

	/**
	 * 判断指定字符串是否为空。
	 * 
	 * @param str
	 *            要判断的字符串
	 * @return 如果指定的字符串为null或者空字符窜，返回true，否则返回false。
	 */
	public static boolean isEmpty(String str) {
		return str == null || str.length() == 0;
	}

	/**
	 * 判断指定字符串是否不为空。
	 * 
	 * @param str
	 *            要判断的字符串
	 * @return 如果指定的字符串不为null且不是空字符窜，返回true，否则返回false。
	 */
	public static boolean isNotEmpty(String str) {
		return !isEmpty(str);
	}

	/**
	 * 判断指定多个字符串是否都为空。
	 * 
	 * @param str
	 *            要判断的字符串
	 * @return 如果指定的多个字符串都为null或者空字符窜，返回true，否则返回false。
	 */
	public static boolean areEmpty(String... strings) {
		for (String s : strings) {
			if (isNotEmpty(s)) {
				return false;
			}
		}

		return true;
	}

	/**
	 * 判断指定多个字符串是否都不为空。
	 * 
	 * @param str
	 *            要判断的字符串
	 * @return 如果指定的多个字符串都不为null且都不是空字符窜，返回true，否则返回false。
	 */
	public static boolean areNotEmpty(String... strings) {
		for (String s : strings) {
			if (isEmpty(s)) {
				return false;
			}
		}

		return true;
	}

	/**
	 * 判断指定的字符串是否为空白字符串。
	 * 
	 * @param str
	 *            要判断的字符串
	 * @return 如果指定的字符串为空(见{@link #isEmpty(String) isEmpty(String)})或者全部为非打印字符，返回true，否则返回false。
	 */
	public static boolean isBlank(String str) {
		if (isEmpty(str)) {
			return true;
		} else {
			Pattern blankPattern = getBlankPattern();
			Matcher matcher = blankPattern.matcher(str);

			return matcher.matches();
		}
	}

	/**
	 * @return 匹配空白字符串的正则表达式的Pattern对象。
	 */
	private static Pattern getBlankPattern() {
		return SingletonHolder.getBlankPattern();
	}

	/**
	 * 判断指定的字符串是否不为空白字符串。
	 * 
	 * @param str
	 *            要判断的字符串
	 * @return 如果指定的字符串不为空(见{@link #isEmpty(String) isEmpty(String)})且包含打印字符，返回true，否则返回false。
	 */
	public static boolean isNotBlank(String str) {
		return !isBlank(str);
	}

	/**
	 * 判断指定的多个字符串是否都为空白字符串。
	 * 
	 * @param strings
	 *            要判断的字符串
	 * @return 如果指定的字符串都为空(见{@link #isEmpty(String) isEmpty(String)})或者全部为非打印字符，返回true，否则返回false。
	 */
	public static boolean areBlank(String... strings) {
		for (String s : strings) {
			if (isNotBlank(s)) {
				return false;
			}
		}

		return true;
	}

	/**
	 * 判断指定的多个字符串是否都不为空白字符串。
	 * 
	 * @param strings
	 *            要判断的字符串
	 * @return 如果指定的字符串都不为空(见{@link #isEmpty(String) isEmpty(String)})且都包含打印字符，返回true，否则返回false。
	 */
	public static boolean areNotBlank(String... strings) {
		for (String s : strings) {
			if (isBlank(s)) {
				return false;
			}
		}

		return true;
	}

	/**
	 * 判断指定的字符串中是否包含SQL操作符。
	 * 
	 * @param str
	 *            要判断的字符串
	 * @return 如果指定的字符串中包含SQL操作符，返回true，否则返回false。
	 */
	public static boolean hasSqlOperator(String str) {
		throw new UnsupportedOperationException("方法未正确实现");
		
//		if (isEmpty(str)) {
//			return false;
//		} else {
//			return getSqlOperatorPattern().matcher(str).matches();
//		}
	}

	/**
	 * @return 匹配SQL操作符的正则表达式Pattern对象。
	 */
	private static Pattern getSqlOperatorPattern() {
		return SingletonHolder.getSqlOperatorPattern();
	}
}
